/******************************************************************************
** 公司名称：天津柯迪斯科技有限公司
** 版权信息：
** 文件名称： App_Protocol_(BF_AND)_CAN.h
** 模块名称： 八方CAN和安乃达CAN兼容协议模块
** 版 本 号： V1.0
** 作    者： 蒲磊
**
** 修改记录： 版本     修改人      时间         修改内容
**
******************************************************************************/
#ifndef __APP_PROTOCOL_BF_CAN_H_
#define __APP_PROTOCOL_BF_CAN_H_

/******************************************************************************
* 头文件
******************************************************************************/
#include "bsp.h"
#include "multi_cyc_fifo.h"
#include "App_Parameter.h"
/******************************************************************************
* 宏定义
******************************************************************************/

/******************************************************************************
* 类型定义
******************************************************************************/

/*************************以下类型定义为八方CAN*******************************/
/*命令码枚举类型*/
typedef enum
{
    Command_Write = 0,			/*写命令*/
    Command_Read,				/*读命令*/
    Command_Ack_Ok,				/*正常应答命令*/
    Command_Ack_Error,			/*错误应答命令*/
    Command_LongData_Start,		/*长数据起始命令*/
    Command_LongData_Transport,	/*长数据传输命令*/
    Command_LongData_End,		/*长数据结束命令*/
    Command_State_Code,			/*状态码命令*/

} enuCommand;

/*节点ID枚举类型*/
typedef enum
{
    Node_Broadcast			= 0x00,			/*广播*/
    Node_Sensor 			= 0x01,			/*传感器*/
    Node_MCU				= 0x02,			/*控制器*/
    Node_LCD				= 0x03,			/*仪表*/
    Node_Battery			= 0x04,			/*电池*/
    Node_Besst				= 0x05,			/*Besst设备*/
    Node_Gearbox			= 0x06,			/*变速器*/
    Node_Elock				= 0x07,			/*电子锁*/
    Node_Torque				= 0x08,			/*力矩设备*/
    Node_IOT				= 0x09,			/*智能设备*/
    Node_VCU				= 0x0B,			/*整车控制器*/
    Node_ABS				= 0x0C,			/*ABS系统*/
    Node_Charging			= 0x0E,			/*充电器*/
    Node_Battery_2			= 0x0F,			/*电池2*/
    Node_TestEquipment_1	= 0x10,			/*测试工装1*/
    Node_TestEquipment_2	= 0x11,			/*测试工装2*/
    Node_Ble				= 0x13,			/*蓝牙模块*/
    Node_Publish			= 0x1F,			/*发布报文*/

} enuNodeID;

/*八方CAN结构体*/
typedef struct
{
    enuNodeID		ID_Src;			/*源ID*/
    enuNodeID		ID_Dst;			/*目标ID*/
    enuCommand		Command;		/*控制命令*/
    uint8_t			Index;			/*索引*/
    uint8_t			SubIndex;		/*子索引*/
    uint8_t			DLC;			/*数据长度*/
    uint8_t			Data[8];		/*数据*/

} strBF_CAN;

/*传感器信息结构体*/
typedef struct
{
    char		HardwareVersion[40];	/*硬件版本号*/
    char		SoftwareVersion[40];	/*软件版本号*/
    uint16_t    TorqueVoltage;			/*力矩电压信号，单位mv，索引0x3100中的D0-D1*/
    uint8_t		Cadence;				/*踏频，单位rpm，索引0x3100中的D2*/
    uint8_t		FrameNum;				/*帧数，索引0x3100中的D3*/
    uint8_t     ErrCode;                /*传感器故障码*/

} strBF_SensorInfo;

/*电控信息结构体*/
typedef struct
{
    char		HardwareVersion[40];	/*硬件版本号*/
    char		SoftwareVersion[40];	/*软件版本号*/
    uint8_t		RemainCapacity;			/*剩余电量，单位：%，对应索引0x3200，D0*/
    uint8_t		Cadence;				/*踏频，单位rpm，索引0x3200中的D3*/
    uint16_t    Trip;                   /*单里程，单位：0.01km*/
    uint16_t    Range;                  /*剩余里程，单位：0.1km*/
    uint16_t    Speed;					/*速度，单位：0.01km/h，对应索引0x3201，D0-D1*/
    uint16_t    Current;				/*电流，单位：0.01A，对应索引0x3201，D2-D3*/
    uint16_t    Voltage;				/*电压，单位：0.01V，对应索引0x3201，D4-D5*/
    uint16_t    SpeedLimit;				/*限速，单位：0.01km/h，对应索引0x3203，D0-D1*/
    uint16_t    WheelSize;				/*轮径，单位：0.1寸，对应索引0x3203，D2-D3*/
    uint16_t    WheelCircumference;		/*车轮周长，单位：mm，对应索引0x3203，D4-D5*/
    uint8_t 	PowerOff;				/*电控关机指令，对应索引0x3204，D0*/
    uint8_t     PushState;              /*助推状态，1-进入助推，0-没进入助推状态*/
    uint16_t    Cal;                    /*卡路里，单位千卡*/
    uint8_t     ErrCode;                /*电控系统故障码*/

} strBF_MCUInfo;

/*电池信息结构体*/
typedef struct
{
    char		HardwareVersion[40];	/*硬件版本号*/
    char		SoftwareVersion[40];	/*软件版本号*/
    uint16_t    TotalCapacity;			/*总容量，单位mAh，对应索引0x3400，D0-D1*/
    uint16_t    RemainCapacity;			/*剩余容量，单位mAh，对应索引0x3400，D2-D3*/
    int16_t		TotalCurrent;			/*总电流，单位0.01A，有符号，正为充电，负为放电，对应索引0x3401，D0-D1*/
    uint16_t    TotalVoltage;			/*总电压，单位0.01V，对应索引0x3401，D2-D3*/
    int8_t		Temperature;			/*温度，有符号，去掉偏移量后的值。对应索引0x3401，D4*/
    uint8_t     RelChargeState;         /*相对容量百分比，单位：1%，对应0x3400的D4*/
    uint8_t     AbsChargeState;         /*绝对容量百分比，单位：1%，对应0x3400的D5*/
    uint8_t     SOH;                    /*SOH,单位：1%，对应0x3400的D6*/
    uint8_t     SeriesNum;              /*电池串数*/
    uint8_t     ParallelNum;            /*并联数量*/
    uint16_t    CycleTimes;             /*循环次数*/
    uint16_t    MaxUnchargeTime;        /*最大未充电时间*/
    uint16_t    LastUnchargeTime;       /*最近未充电时间*/
    uint16_t    CellVoltage[32];		/*单个电芯电压，1-32号电芯，单位0.01mv，对应索引0x3410-0x3417或者0x6402-0x6409*/
    uint8_t     ErrCode;                /*电池系统故障码*/

} strBF_BatteryInfo;

/*仪表信息结构体*/
typedef struct
{
    char		HardwareVersion[40];	/*硬件版本号*/
    char		SoftwareVersion[40];	/*软件版本号*/
    uint32_t    TotalTime;				/*总计骑行时间，单位：分钟*/
    uint8_t		IdleTime;				/*自动关机时间，单位：分钟*/
    uint32_t    Odo;					/*总里程，单位：km*/
    uint32_t    Trip;					/*单次里程，单位：0.1km*/
    uint16_t    MaxSpeed;				/*最大速度，单位：0.1Km/h*/
    uint16_t    AvgSpeed;				/*平均速度，单位：0.1Km/h*/
    uint32_t    ServiceMileage;			/*维护里程，单位：0.1km/h*/
    uint8_t		MaxPas;					/*总档位*/
    uint8_t		Mode;					/*模式，bit0,0-ECO，1-sprot,bit1,0-非Boost模式，1-Boost模式,bit2,0-无意义，1-当ECO_Sport=1时，表示Normal模式*/
    uint8_t		Pas;					/*档位*/
    uint8_t		LampAndKeyState;		/*大灯和按键状态。bit0-大灯状态，0-关灯，1-开灯，bit1-加键状态，0-未按下，1-按下，bit2-i键状态，0-未按下，1-按下，bit3-大灯键状态，0-未按下，1-按下*/
    uint8_t		ClearTrip;				/*清Trip里程*/
    uint8_t     IsInPassword;           /*是否处于密码输入模式，0-正常模式，1-密码输入模式*/

} strBF_DisplayInfo;
/***************************************************************************/



/*定义车辆信息结构体，八方CAN和安乃达CAN通用*/
typedef    struct
{
    strBF_SensorInfo     Sensor;
    strBF_BatteryInfo    Battery;
    strBF_MCUInfo		 MCU;
    strBF_DisplayInfo    Display;
    uint8_t			     ErrCode;

} strBF_BikeInfo;



/******************************************************************************
* 全局变量声明
******************************************************************************/

/******************************************************************************
* 函数声明
******************************************************************************/

void        vPROTOCOL_BF_Loop(void);
#if defined N32L40X     /*该宏定义在工程选项菜单中被定义*/
void        vPROTOCOL_CanMsgToBFMsg(CanRxMessage *pCanMessage);
#else
void        vPROTOCOL_CanMsgToBFMsg(can_rx_message_type *pCanMessage);
#endif
void        vBF_CAN_Send_Msg(enuNodeID SourceID,enuNodeID TargetID,enuCommand Cmd,uint8_t Index,uint8_t SubIndex,uint8_t Datalen,uint8_t * pData);
void        vBF_ResetCommunicationOverTime(void);
void        vPROTOCOL_Set_Button_BF(uint8_t KeyValue);
void        vPROTOCOL_Set_Value_When_PowerOn_BF(void);

/*获取电控信息的函数接口*/
uint8_t 	vBF_CAN_Get_MCU_HardwareVersion(char * pBuffer,uint16_t len);	/*获取MCU硬件版本号*/
uint8_t 	vBF_CAN_Get_MCU_SoftwareVersion(char * pBuffer,uint16_t len);	/*获取MCU软件版本号*/
uint8_t 	ucBF_CAN_Get_MCU_RemainCapacity(void);							/*获取MCU发送的剩余电量信息，单位：%*/
uint8_t		usBF_CAN_Get_MCU_Cadence(void);									/*获取MCU发送的踏频信息，单位：rpm*/
uint16_t 	usBF_CAN_Get_MCU_Speed(void);									/*获取MCU发送的速度信息，单位：0.01Km/h*/
uint16_t    usBF_CAN_Get_MCU_Current(void);									/*获取MCU发送的电流信息，单位：0.01A*/
uint16_t    usBF_CAN_Get_MCU_Voltage(void);									/*获取MCU发送的电压信息，单位：0.01V*/
uint16_t    usBF_CAN_Get_MCU_SpeedLimit(void);								/*获取MCU发送的限速信息，单位：0.01Km/h*/
uint16_t    usBF_CAN_Get_MCU_WheelSize(void);								/*获取MCU发送的轮径信息，单位：0.1英寸*/
uint16_t    usBF_CAN_Get_MCU_WheelCircumference(void);						/*获取MCU发送的轮径周长，单位：1mm*/
uint8_t		ucBF_CAN_Get_MCU_PowerOff(void);								/*获取MCU发送的关机指令*/
uint16_t    usBF_CAN_Get_MCU_Trip(void);                                    /*获取MCU发送的单里程，单位：0.01km*/
uint16_t    usBF_CAN_Get_MCU_Range(void);                                   /*获取MCU发送的剩余里程数据，单位：0.01km*/
uint8_t     ucBF_CAN_Get_MCU_PushState(void);                               /*获取MCU发送的助推状态值*/
uint16_t     usBF_CAN_Get_MCU_Cal(void);                                    /*获取MCU发送的卡路里值，单位：千卡*/
/*获取电池信息的函数接口*/
uint8_t		vBF_CAN_Get_BAT_HardwareVersion(char * pBuffer,uint16_t len);	/*获取电池硬件版本号*/
uint8_t 	vBF_CAN_Get_BAT_SoftwareVersion(char * pBuffer,uint16_t len);	/*获取电池软件版本号*/
uint16_t    usBF_CAN_Get_BAT_TotalCapacity(void);							/*获取电池组总容量，单位：1mAh*/
uint16_t    usBF_CAN_Get_BAT_RemainCapacity(void);							/*获取电池组剩余容量，单位：1mAh*/
int16_t		ssBF_CAN_Get_BAT_TotalCurrent(void);							/*获取电池组总电流，正为充电，负为放电，单位：0.01A*/
uint16_t    usBF_CAN_Get_BAT_TotalVoltage(void);							/*获取电池组总电压，单位：0.01V*/
int8_t		scBF_CAN_Get_BAT_Temperature(void);								/*获取电池组温度，单位：1摄氏度*/
uint16_t    usBF_CAN_Get_BAT_CellVoltage(uint8_t Cell);						/*获取某个电芯的电压，单位：0.01V*/
uint8_t     ucBF_CAN_Get_BAT_RelChargeState(void);                          /*获取电池组相对容量百分比，单位：1%*/
uint8_t     ucBF_CAN_Get_BAT_AbsChargeState(void);                          /*获取电池组绝对容量百分比，单位：1%*/
uint8_t     ucBF_CAN_Get_BAT_SOH(void);                                     /*获取电池组SOH，单位：1%*/
uint8_t     ucBF_CAN_Get_BAT_SeriesNum(void);                               /*获取电池组串数*/
uint8_t     ucBF_CAN_Get_BAT_ParallelNum(void);                             /*获取电池组并数*/
uint16_t    usBF_CAN_Get_BAT_CycleTimes(void);                              /*获取电池组循环次数*/
uint16_t    usBF_CAN_Get_BAT_MaxUnchargeTime(void);                         /*获取最大未充电时间，单位：1h*/
uint16_t    usBF_CAN_Get_BAT_LastUnchargeTime(void);                        /*获取最近未充电时间，单位：1h*/

/*获取传感器信息的函数接口*/
uint8_t 	vBF_CAN_Get_Sensor_HardwareVersion(char * pBuffer,uint16_t len);	/*获取传感器硬件版本号*/
uint8_t 	vBF_CAN_Get_Sensor_SoftwareVersion(char * pBuffer,uint16_t len);	/*获取传感器软件版本号*/

uint8_t     ucBF_CAN_Get_ErrCode(void);                                         /*获取错误代码*/

/*设置仪表数据接口函数*/
void        vBF_CAN_Set_Pas(int8_t Pas);                                        /*设置当前挡位*/
void        vBF_CAN_Set_MaxPas(uint8_t MaxPas);                                 /*设置最大挡位*/
void        vBF_CAN_Set_TotalTime(uint32_t TotalTime);                          /*设置总计骑行时间（分钟）*/
void        vBF_CAN_Set_IdleTime(uint8_t    IdleTime);                          /*设置自动关机时间（分钟）*/
void        vBF_CAN_Set_Odo(uint32_t Odo);                                      /*设置ODO里程，单位：1Km*/
void        vBF_CAN_Set_Trip(uint32_t Trip);                                    /*设置Trip里程，单位：0.1Km*/
void        vBF_CAN_Set_MaxSpeed(uint16_t MaxSpeed);                            /*设置最大速度，单位：0.1km/h*/
void        vBF_CAN_Set_AvgSpeed(uint16_t AvgSpeed);                            /*设置平均速度，单位：0.1Km/h*/
void        vBF_CAN_Set_ServiceMileage(uint32_t ServiceMileage);                /*设置维护里程，单位：0.1km*/
void        vBF_CAN_Set_Mode(uint8_t Mode);                                     /*设置骑行模式*/
void        vBF_CAN_Set_Lamp(uint8_t Lamp);                                     /*设置大灯状态*/
void        vBF_CAN_Set_ClearTrip(void);                                        /*设置清Trip*/
void        vBF_CAN_Set_UpKeyState(uint8_t KeyState);                           /*设置UP键状态*/
void        vBF_CAN_Set_iKeyState(uint8_t KeyState);                            /*设置I键状态*/
void        vBF_CAN_Set_LampKeyState(uint8_t KeyState);                         /*设置大灯键状态*/
void        vBF_CAN_Set_InPassword(uint8_t IsInPassword);                       /*设置是否处于密码输入模式*/

void vBF_CAN_Send_Get_Hardware_Version(enuNodeID DstNodeId);                    /*向节点发送请求硬件版本号指令*/
void vBF_CAN_Send_Get_Software_Version(enuNodeID DstNodeId);                    /*向节点发送请求软件版本号指令*/
void vBF_CAN_Send_Get_Battery_Info(void);                                       /*向电池节点发送请求电池信息的一组命令*/
void vBF_CAN_Send_Get_All_Version(void);                                        /*发送读取所有版本号命令，该函数定时调用，读取所有版本号*/

/*以下函数属于CAN协议之外的内容，需要在协议移植时需要提供*/
extern void vSet_And_Save_ODO(uint32_t ODO);                                      /*设置ODO里程，并保存*/
extern void vSet_And_Save_TRIP(uint32_t Trip);                                    /*设置Trip里程，并保存*/
extern void vSet_Clock(uint8_t Hour,uint8_t Min,uint8_t Sec);                     /*设置时间*/
extern void vSet_And_Save_ServiceMileage(uint32_t Mileage);                       /*设置服务里程*/
extern void vSave_ErrorCode(uint8_t ErrorCode);                                   /*保存错误代码*/
extern void vSave_WarningCode(uint8_t WarningCode);                               /*保存警告代码*/




#endif
